package com.raising.sc.core.util.common;

import com.raising.sc.core.util.base.BaseUtils;

import java.util.concurrent.*;

/**
 * 线程处理工具
 *
 * Java通过Executors提供四种线程池，分别为：
 newCachedThreadPool创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
 newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。
 newScheduledThreadPool 创建一个定长线程池，支持定时及周期性任务执行。
 newSingleThreadExecutor 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
 * 
 * @author gaoy
 */
public class ThreadUtils extends BaseUtils {

	/**
	 * 单线程执行器
	 * 创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
	 */
	public static ExecutorService singleExecutor = Executors.newSingleThreadExecutor();

	/**
	 * 动态多线程执行器
	 * 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
	 * use : 见main方法
	 * 默认使用了最大值，最好手动创建
	 */
	public static ExecutorService executor = Executors.newCachedThreadPool();

	/**
	 * sleep等待,单位为毫秒 忽略InterruptedException.
	 */
	public static void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			logger.error(e.getMessage(), e);
		}
	}

	public static void main(String[] args){
		ThreadUtils.executor.execute(new Runnable() {
			@Override
			public void run() {

			}
		});

		//最多允许的线程数
		int maximumPoolSize = 100;
		//手动创建如下
		ExecutorService executor = new ThreadPoolExecutor(0, maximumPoolSize,
				60L, TimeUnit.SECONDS,
				new SynchronousQueue<Runnable>());

		executor.execute(new Runnable() {
			@Override
			public void run() {

			}
		});
	}

}
